#ifndef SCREENVIEWER_H
#define SCREENVIEWER_H

#include <QWidget>
#include <QImage>
#include <QPainter>
#include <QMouseEvent>
#include <QKeyEvent>
#include <QTimer>
#include <QBuffer>
#include <QPaintEvent>
#include <QResizeEvent>

#include "../../logging/logger.h"

class ScreenViewer : public QWidget
{
    Q_OBJECT

public:
    explicit ScreenViewer(QWidget *parent = nullptr);
    ~ScreenViewer();

    // 设置远程屏幕图像数据
    void setImage(const QByteArray &imageData);
    
    // 设置远程屏幕尺寸
    void setRemoteScreenSize(int width, int height);
    
    // 获取远程屏幕尺寸
    QSize getRemoteScreenSize() const;
    
    // 设置是否允许鼠标键盘控制
    void setControlEnabled(bool enabled);
    
    // 是否允许控制
    bool isControlEnabled() const;
    
    // 设置画面缩放模式
    enum ScaleMode {
        NoScale,        // 不缩放
        ScaleToFit,     // 缩放以适应窗口大小
        ScaleKeepRatio  // 按比例缩放
    };
    void setScaleMode(ScaleMode mode);
    
    // 设置是否绘制控制指示器（鼠标位置等）
    void setDrawIndicators(bool draw);

signals:
    // 鼠标事件信号
    void mousePressed(int x, int y, int button);
    void mouseReleased(int x, int y, int button);
    void mouseMoved(int x, int y);
    
    // 键盘事件信号
    void keyPressed(int key);
    void keyReleased(int key);
    
    // 屏幕大小变化信号
    void screenSizeChanged(int width, int height);

protected:
    void paintEvent(QPaintEvent *event) override;
    void mousePressEvent(QMouseEvent *event) override;
    void mouseReleaseEvent(QMouseEvent *event) override;
    void mouseMoveEvent(QMouseEvent *event) override;
    void keyPressEvent(QKeyEvent *event) override;
    void keyReleaseEvent(QKeyEvent *event) override;
    void resizeEvent(QResizeEvent *event) override;

private:
    QImage remoteScreen;         // 远程屏幕图像
    QSize remoteScreenSize;      // 远程屏幕尺寸
    bool controlEnabled;         // 是否允许控制
    ScaleMode scaleMode;         // 缩放模式
    bool drawIndicators;         // 是否绘制指示器
    QPoint lastCursorPos;        // 上次光标位置
    
    // 将本地坐标转换为远程坐标
    QPoint mapToRemote(const QPoint &localPos);
    
    // 将远程坐标转换为本地坐标
    QPoint mapToLocal(const QPoint &remotePos);
    
    // 计算适应窗口的比例
    qreal calculateScale() const;
    
    // 解析图像数据
    bool loadImage(const QByteArray &imageData);
};

#endif // SCREENVIEWER_H 